package com.unionpay.fsas.demo.nonbank;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.unionpay.fsas.sdk.FsasService;
import com.unionpay.fsas.sdk.LogUtil;
import com.unionpay.fsas.sdk.SDKConfig;


/**
 * 重要：联调测试时请仔细阅读注释！ 产品：资金结算接入系统<br>
 * 交易：客户资金结算入账状态查询：<br>
 * 日期： 2018-09<br>
 * 参考《中国银联资金结算接入系统技术指南 第1部分 交易及报文接口（支付机构适用）》第5.19章节
 */
public class Form_5_19_EntryStatusQuery extends HttpServlet {

	/**
     * 
     */
    private static final long serialVersionUID = -8674916870002014502L;

    @Override
	public void init(ServletConfig config) throws ServletException {
		/**
		 * 请求银联接入地址，获取证书文件，证书路径等相关参数初始化到SDKConfig类中 在java main 方式运行时必须每次都执行加载
		 * 如果是在web应用开发里,这个方法可使用监听的方式写入缓存,无须在这出现
		 */
		// 这里已经将加载属性文件的方法挪到了web/AutoLoadServlet.java中
		// SDKConfig.getConfig().loadPropertiesFromSrc();
		// //从classpath加载acp_sdk.properties文件
		super.init();
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		String acqInsCode = req.getParameter("acqInsCode");
		String txnNo = req.getParameter("txnNo");
		String txnDate = req.getParameter("txnDate");
		String origTxnNo = req.getParameter("origTxnNo");
		String origTxnDate = req.getParameter("origTxnDate");

		Map<String, String> contentData = new HashMap<String, String>();

		/*** 银联资金结算接入系统，产品参数，除了encoding自行选择外其他不需修改 ***/
		contentData.put("version", DemoBase.version); // 版本号
		contentData.put("encoding", DemoBase.encoding); // 字符集编码
														// 可以使用UTF-8,GBK两种方式
		contentData.put("signMethod", SDKConfig.getConfig().getSignMethod()); // 签名方法
		contentData.put("txnType", "07"); // 交易类型 07 客户资金结算入账状态查询
		
		contentData.put("txnNo", txnNo); // 交易流水号
		contentData.put("acqInsCode", acqInsCode); // 机构代码
		contentData.put("txnDate", txnDate); // 交易日期
		contentData.put("sndTime", DemoBase.getSendTime()); // 发送时间 格式HHmmss

		contentData.put("origTxnNo", origTxnNo); // 原交易流水号
		contentData.put("origTxnDate", origTxnDate); // 原交易日期

		
		/** 对请求参数进行签名并发送http post请求，接收同步应答报文 **/
		Map<String, String> reqData = FsasService.sign(contentData,
				DemoBase.encoding); // 报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
		String requestBackUrl = SDKConfig.getConfig().getBackRequestUrl(); // 交易请求url从配置文件读取对应属性文件fsas_sdk.properties中的
																			// fsassdk.backTransUrl
		Map<String, Object> rspData = FsasService.doPost(reqData,
				requestBackUrl, DemoBase.encoding); // 发送请求报文并接受同步应答（默认连接超时时间30秒，读取返回结果超时时间30秒）;这里调用signData之后，调用submitUrl之前不能对submitFromData中的键值对做任何修改，如果修改会导致验签不通过

		/** 对应答码的处理，请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考-------------> **/
		// 应答码规范参考open.unionpay.com帮助中心 下载 产品接口规范 《平台接入接口规范-第5部分-附录》
		StringBuffer parseStr = new StringBuffer("");
		if (!rspData.isEmpty()) {
			if (FsasService.validateNew(rspData, DemoBase.encoding)) {
				LogUtil.writeLog("验证签名成功");
				String respCode = rspData.get("respCode").toString();
				String origRespCode = rspData.get("origRespCode").toString();
				if (("00").equals(respCode)) {
					// 交易已受理(不代表交易已成功），等待接收后台通知更新订单状态,也可以主动发起 查询交易确定交易状态。
					// TODO
					if (("00").equals(origRespCode)) {
						// 代表原交易成功 如不成功根据原交易应答码做相应处理
						// TODO
					} else if (("03").equals(origRespCode)
							|| ("05").equals(origRespCode)) {
						// 订单处理中或交易状态未明，需稍后发起交易状态查询交易
						// TODO
					} else {
						 //其它根据需要作处理 
						// TODO
					}
				} else {
					// 其他应答码为失败请排查原因
					// TODO
				}
			} else {
				LogUtil.writeErrorLog("验证签名失败");
				// TODO 检查验证签名失败的原因
			}
		} else {
			// 未返回正确的http状态
			LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
		}
		String reqMessage = DemoBase.genHtmlResult(reqData);
		String rspMessage = DemoBase.genHtmlResultNew(rspData);
		resp.getWriter().write(
				"客户资金结算入账状态查询 请求报文:<br/>" + reqMessage + "<br/>" + "应答报文:</br>"
						+ rspMessage + parseStr);
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
}